package com.example.demo.suanfa;

/* ━━━━━━佛祖保佑━━━━━━
 *                  ,;,,;
 *                ,;;'(    社
 *      __      ,;;' ' \   会
 *   /'  '\'~~'~' \ /'\.)  主
 * ,;(      )    /  |.     义
 *,;' \    /-.,,(   ) \    码
 *     ) /       ) / )|    农
 *     ||        ||  \)
 *     (_\       (_\
 * ━━━━━━永无BUG━━━━━━
 * @author ：zjq
 * @date ：2021/4/26 16:26
 * @description: TODO               令牌桶  sentinel 预热
 * @version: V1.0
 * @slogan: 天下风云出我辈，一入代码岁月催
 */
public class TokenBucket {

    public long timeStamp = System.currentTimeMillis();  // 当前时间
    public long capacity; // 桶的容量
    public long rate; // 令牌放入速度
    public long tokens; // 当前令牌数量

    public boolean grant() {
        long now = System.currentTimeMillis();
        // 先添加令牌
        tokens = Math.min(capacity, tokens + ((now - timeStamp)/1000) * rate);
        timeStamp = now;
        if (tokens < 1) {
            // 若不到1个令牌,则拒绝
            return false;
        } else {
            // 还有令牌，领取令牌 表示当前有多少个流量
            tokens -= 5;
            return true;
        }
    }

    public static void main(String[] args) throws InterruptedException {
        TokenBucket a = new TokenBucket();
        a.capacity = 30;   a.rate = 1;   a.tokens = 10;
        while (true) {
            Thread.sleep(1001);
            boolean limit = a.grant();
            if (limit) {
                System.out.println("没有限流: " + a.tokens);
            } else {
                System.out.println("限流: " + a.tokens);
            }
        }
    }
}
